Golang 实现从串口读取信息

您所在的位置:网站首页 golang serial Golang 实现从串口读取信息

Golang 实现从串口读取信息

#Golang 实现从串口读取信息| 来源: 网络整理| 查看: 265

Golang实现对串口的操作的库:https://github.com/huin/goserial

以环天BU353 路测USB GPS为例,该GPS模块的主要参数:http://jn.goepe.com/apollo/show_product1.php?id=2164028&uid=zhaogis

GPS模块的驱动安装 驱动程序可以去官网下载,下载地址: http://usglobalsat.com/s-24-support-drivers.aspx 备用下载地址:http://usglobalsat.com/s-172-bu-353-s4-support.aspx

GPS模块的应用程序设计 实现读取并解析GPS信息的代码如下:

package model import ( // "fmt" // "infrastructure/log" // "io" "math" "strconv" "strings" "time" "infrastructure/github.com/serial" ) type GpsInfo struct { Longitude string Latitude string LonDirection string LatDirection string LongitudeRadian float64 LatitudeRadian float64 IsGpsNormal bool } type ComObject struct { ComName string Baudrate int // Com io.ReadWriteCloser Com *serial.SerialPort IsComNormal bool CloseChan chan bool } var ( ComName = "COM3" ComObj = &ComObject{ComName: ComName, Baudrate: 4800, IsComNormal: false, CloseChan: make(chan bool, 1)} GpsObj = &GpsInfo{IsGpsNormal: false} BsGpsObj = &GpsInfo{IsGpsNormal: true, LonDirection: "E", LongitudeRadian: 116.63, LatDirection: "N", LatitudeRadian: 40.32} UeBsDistance float64 = 0 directionMap = map[string]string{ "N": "北纬", "S": "南纬", "E": "东经", "W": "西经", } ) func StartGpsModule() { ComObj.ComName = ComName if true == ComObj.GetPortName() { ComName = ComObj.ComName } for { if true == ComObj.IsComNormal { len(strSlice[4]) { return false } GpsObj.LatDirection = strSlice[3] GpsObj.LonDirection = strSlice[5] GpsObj.Latitude = directionMap[strSlice[3]] + strSlice[2][:2] + "度" + strSlice[2][2:] + "分" GpsObj.Longitude = directionMap[strSlice[5]] + strSlice[4][:3] + "度" + strSlice[4][3:] + "分" tmpIntPartLat, _ := strconv.ParseFloat(strSlice[2][:2], 32) tmpDecimalPartLat, _ := strconv.ParseFloat(strSlice[2][2:], 32) GpsObj.LatitudeRadian = tmpIntPartLat + tmpDecimalPartLat/60 tmpIntPartLon, _ := strconv.ParseFloat(strSlice[4][:3], 32) tmpDecimalPartLon, _ := strconv.ParseFloat(strSlice[4][3:], 32) GpsObj.LongitudeRadian = tmpIntPartLon + tmpDecimalPartLon/60 return true } func parseLongitudeAndLatitudeFromGprmc(gprmcInfo string) bool { strSlice := strings.Split(gprmcInfo, ",") if 3 > len(strSlice[3]) || 4 > len(strSlice[5]) { return false } GpsObj.LatDirection = strSlice[4] GpsObj.LonDirection = strSlice[6] GpsObj.Latitude = directionMap[strSlice[4]] + strSlice[3][:2] + "度" + strSlice[3][2:] + "分" GpsObj.Longitude = directionMap[strSlice[6]] + strSlice[5][:3] + "度" + strSlice[5][3:] + "分" tmpIntPartLat, _ := strconv.ParseFloat(strSlice[3][:2], 32) tmpDecimalPartLat, _ := strconv.ParseFloat(strSlice[3][2:], 32) GpsObj.LatitudeRadian = tmpIntPartLat + tmpDecimalPartLat/60 tmpIntPartLon, _ := strconv.ParseFloat(strSlice[5][:3], 32) tmpDecimalPartLon, _ := strconv.ParseFloat(strSlice[5][3:], 32) GpsObj.LongitudeRadian = tmpIntPartLon + tmpDecimalPartLon/60 return true } func CalcDistByLongitudeLantitude(gpsPointA, gpsPointB GpsInfo) (distance float64) { if false == gpsPointA.IsGpsNormal || false == gpsPointB.IsGpsNormal { return 0 } lonA, latA := getFormatedLongitudeLantitude(gpsPointA) lonB, latB := getFormatedLongitudeLantitude(gpsPointB) c := math.Sin(latA*math.Pi/180)*math.Sin(latB*math.Pi/180)*math.Cos((lonA-lonB)*math.Pi/180) + math.Cos(latA*math.Pi/180)*math.Cos(latB*math.Pi/180) distance = 6371004 * math.Acos(c) return } func getFormatedLongitudeLantitude(gpsPoint GpsInfo) (lon, lat float64) { if "E" == gpsPoint.LonDirection { lon = gpsPoint.LongitudeRadian } else { lon = 0 - gpsPoint.LongitudeRadian } if "N" == gpsPoint.LatDirection { lat = 90 - gpsPoint.LatitudeRadian } else { lat = 90 + gpsPoint.LatitudeRadian } return }

可参考:http://studygolang.com/articles/302



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3